package com.itany.corejava.code11_内部类;

/**
 * @author 石小俊
 * @version 1.0
 * @date 2023年03月20日 14:48
 */
public class Test01_成员内部类 {
    public static void main(String[] args) {
        // 获取外部类
        Outer out = new Outer();
        // out.show();

        // 获取内部类
        // 在外部类实例化内部类时,其类名是通过"外部类.内部类"来定义的
        // 此时实例化对象时,需要调用内部类的构造方法,此时需要通过外部类的对象来调用
        Outer.Inner in = out.new Inner();
        // 在非外部类中访问内部类的成员
        // 不能访问private所修饰的属性
        // System.out.println("内部类的属性:"+in.name);
        System.out.println("内部类的属性:"+in.gender);
        in.print();
    }
}
// 外部类
class Outer{
    private String name = "admin";
    private int age = 18;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void show(){
        System.out.println("***************外部类方法***************");
        // 在外部类中访问内部类中的信息
        Inner inner = new Inner();
        System.out.println("访问内部类的属性:"+inner.name);
        // inner.print();
    }

    private void test(){
        System.out.println("这是外部类的私有方法");
    }


    // 定义成员内部类
    class Inner{
        private String name = "jack";
        String gender = "男";

        public String getGender() {
            return gender;
        }

        public void setGender(String gender) {
            this.gender = gender;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public void print(){
            System.out.println("***************内部类方法***************");
            // 如果外部类的属性与内部类属性不同名
            System.out.println("外部类的age属性:"+age);
            // 如果外部类属性与内部类属性同名,通过对象来访问
            // 否则默认访问的就是内部类自己的
            Outer out = new Outer();
            System.out.println("外部类的属性:"+out.name);
            // 或者通过外部类的类名.this.属性名进行访问
            System.out.println(Outer.this.name);
            // 跟其他方法访问方式一致
            show();
            test();
        }
    }
}